
package ChatNI;

import common.Fichier;
import common.Message;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;

/**
 *Classe servant à la communication via TCP 
 * Ce type de communication est utilisé pour l'envoi de fichiers
 * @author Marion et Nicolas
 */

public class TCPCom {
    private Socket clientTCP;
    private Thread thread;
    
   /**
     * Ce constructeur permet de creer un client TCP, et lance donc un thread pour l'envoi
     * @param portDest
     * @param addrDest 
     */
    public TCPCom (int portDest, InetAddress addrDest) {
        
        try {
            ChatNI.portDestination = portDest;
            clientTCP = new Socket(addrDest,ChatNI.numPortTCPecoute);
            //Création d'un thread pr l'envoi
            thread = new Thread();
            //Démarrage du thread
            thread.start();
        } catch (IOException ex) {
             System.out.println("Erreur dans le constructeur TCPCom");
        }
    }

    
  /**
     * Envoi d'un message via TCP
     * @param message 
     */
    public void sendMessage (Message message){
            try{
                byte[] tablOctets = new byte[1024];
                Fichier fic = (Fichier)message;                    
                File f = fic.getFic();                              
                OutputStream os = clientTCP.getOutputStream();
                BufferedOutputStream bos = new BufferedOutputStream(os,1024);
                FileInputStream in = new FileInputStream(f);
                int i = 0;
                int bytecount = 1024;
                
                while ((i = in.read(tablOctets, 0, 1024)) != -1) {   // On lit par block de 1024 le fichier f,
                    bytecount = bytecount + 1024;                    // du coup, notre compteur s'incrément de 1024,
                    bos.write(tablOctets, 0, i);                     // on envoie sur le bufferedOutput,
                    bos.flush();                                     // on vide le buffer..
                }
                clientTCP.shutdownOutput();                          // On prévient qu'on n'envoie plus
                System.out.println("On a envoye :" + bytecount+" octets");
                
                // Attente d'un accuse de reception de la part du serveur..
                ObjectInputStream ois = new ObjectInputStream(clientTCP.getInputStream());
                String accuse = (String) ois.readObject();
                System.out.println("accuse de reception : "+accuse);
                               
            } catch (Exception e){
                System.out.println("Erreur d'envoi de message TCP");
            }
    }
    
  /**
     * Arrêt d'une connexion TCP
     */
    public void stop(){
        try {
            clientTCP.close();
            thread.interrupt();
        } catch (IOException ex) {
            System.out.println("Erreur lors de l'arrêt de la communication");
        }
    }

}
